package com.anguin.mylibrary.controller;
import com.anguin.mylibrary.entity.UserEntity;
import com.anguin.mylibrary.service.UserService;
import com.anguin.mylibrary.service.ex.SessionExpiration;
import com.anguin.mylibrary.util.JsonResult;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.Map;

/**
 * UserController 是一个 RESTful 控制器，负责处理与用户相关的 HTTP 请求。
 * 它提供了用户登录和注册的 API 端点，并将请求委托给 UserService 进行处理。
 */
@RestController
@RequestMapping("/api/users")
public class UserController extends BaseController
{

    @Autowired
    private UserService userService;  // 注入 UserService，负责用户相关的业务逻辑

    /**
     * 处理用户登录请求。
     * 接收用户名和密码，通过 UserService 验证用户的登录信息。
     * 如果用户名或密码不正确，则返回相应的错误响应。
     *
     * @param username 用户名，通过请求参数传入
     * @param password 密码，通过请求参数传入
     * @return 登录结果的 ResponseEntity 响应体，包含用户信息或错误消息
     */
    @PostMapping("/login")
    public JsonResult<UserEntity> login(@RequestParam String username, @RequestParam String password, HttpSession session)
    {
        // 调用 UserService 查找用户
        UserEntity user = userService.login(username, password);

        System.out.println(user);
        session.setAttribute("uid", user.getUserId());
        session.setAttribute("username", username);

        System.out.println(session.getAttribute("uid").toString());

//        session.setAttribute("username",username);
        // 更新用户的最后登录时间
        userService.updateLastLogin(user.getUserId());


        // 返回用户信息和 200 OK 状态
        return new JsonResult<>(JsonResult.SUCCESS, user);
    }


    /**
     * 处理用户注册请求。
     * 接收用户信息和头像文件，解析用户信息并通过 UserService 进行注册。
     * 如果用户上传了头像，则保存头像并将头像 URL 存入用户信息中。
     *
     * @param user   包含用户注册信息的 UerEntity类 ，通过 @RequestPart 注解传入
     * @param avatar 头像文件，通过 @RequestPart 注解传入，非必填
     * @return 注册结果的 ResponseEntity 响应体，包含成功消息
     */
    @PostMapping("/register")
    public JsonResult<Void> register(@RequestPart("user") UserEntity user,
                                     @RequestPart(value = "avatar", required = false) MultipartFile avatar)
    {
        // 解析传入的用户 JSON 数据为 UserEntity 对象
//        UserEntity user = userService.parseUserJson(userJson);

        // 检查是否上传了头像文件
        if (avatar != null && !avatar.isEmpty())
        {
            // 保存头像文件，返回头像 URL
            String avatarUrl = userService.saveAvatar(avatar);
            // 将头像 URL 设置到用户对象中
            user.setAvatarUrl(avatarUrl.replace("\\", "/"));
        }
        System.out.println(user.getAvatarUrl());

        // 调用 UserService 注册新用户
        userService.register(user);

        // 返回 200 OK 状态，提示注册成功
        return new JsonResult<>(JsonResult.SUCCESS);
    }

    @PostMapping("updateUserInfo")
    public JsonResult<UserEntity> updateUserInfo(@RequestBody UserEntity user, HttpSession session)
    {
        int userId = getUidFromSession(session);
        UserEntity result = userService.updateUser(userId, user);
        if (result.getAvatarUrl() != null && !result.getAvatarUrl().isEmpty())
        {
            result.setAvatarUrl(result.getAvatarUrl().replace("\\", "/"));
        }
        System.out.println(result.getAvatarUrl());
        return new JsonResult<>(JsonResult.SUCCESS, result);
    }

    @PostMapping("updateUserAvatar")
    public JsonResult<UserEntity> updateUserAvatar(@RequestPart("username") String username, @RequestPart(value = "avatar", required = false) MultipartFile avatar, HttpSession session)
    {
        ObjectMapper objectMapper = new ObjectMapper();
        Map map = null;
        try
        {
            map = objectMapper.readValue(username, Map.class);
        } catch (JsonProcessingException e)
        {
            throw new RuntimeException(e);
        }
        String realUsername = (String) map.get("username");
        UserEntity user = userService.findByUsername(realUsername);
        UserEntity user1 = new UserEntity(user.getUserId());
        System.out.println(user);
        if (avatar != null && !avatar.isEmpty())
        {
            String avatarUrl = userService.saveAvatar(avatar);
            user1.setAvatarUrl(avatarUrl.replace("\\", "/"));
        }
        int userId = getUidFromSession(session);
        UserEntity result = userService.updateUser(userId, user1);
        System.out.println(result.getAvatarUrl());

        return new JsonResult<>(JsonResult.SUCCESS, result);
    }

    @PostMapping("updatePassword")
    public JsonResult<String> updatePassword(@RequestParam String oldPassword, @RequestParam String newPassword, HttpSession session)
    {
        Object uidObject = session.getAttribute("uid");
        if (uidObject == null)
        {
            // 会话过期或用户未登录
            System.out.println("会话过期或用户未登录");
            throw new SessionExpiration("会话过期或用户未登录");
        }
        int userId = getUidFromSession(session);
        System.out.println(userId);
        userService.changePassword(userId, oldPassword, newPassword);
        return new JsonResult<>(JsonResult.SUCCESS);
    }

    @PostMapping("retrievePassword")
    public JsonResult<Void> retrievePassword(@RequestParam String phoneNumber, @RequestParam String newPassword)
    {
        UserEntity user = userService.findByPhoneNumber(phoneNumber);
        int userId = user.getUserId();
        userService.changePassword(userId, newPassword);
        return new JsonResult<>(JsonResult.SUCCESS);
    }

}
